package streeam;

import java.util.*;
import java.util.stream.Collectors;

/**
 * filter：根据指定的条件过滤集合中的元素。
 * map：将集合中的每个元素按照指定的映射方式进行转换。
 * forEach：对集合中的每个元素执行指定操作。
 * sorted：对集合中的元素进行排序。
 * distinct：去除集合中重复的元素。
 * limit：截取指定数量的元素。
 * skip：跳过指定数量的元素。
 * collect：将Stream中的元素收集到一个新的集合中。
 * reduce：通过累积操作将集合中的元素归约为单个结果。
 * anyMatch：判断集合中是否存在任意一个元素满足指定条件。
 * allMatch：判断集合中是否所有元素都满足指定条件。
 * noneMatch：判断集合中是否没有任何元素满足指定条件。
 * findFirst：返回集合中的第一个元素。
 * findAny：返回集合中的任意一个元素。
 * flatMap：将多个Stream合并为一个Stream。
 * min：找到集合中的最小元素。
 * max：找到集合中的最大元素
 */
public class StreamTest {
    public static void main(String[] args) {
        StreamTest streamTest = new StreamTest();
        List<Person> datas = createData();
        // 过滤操作
        //datas = streamTest.filterOperator(datas);
        //streamTest.printResult(datas);
        // map操作
        streamTest.mapOperator(datas);
    }

    /**
     * 创建数据
     *
     * @return
     */
    public static List<Person> createData() {
        List<Person> peopleList = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            List<String> happies = new ArrayList<>();
            happies.add("篮球" + i);
            happies.add("足球" + i);
            Map<String, Object> map = new HashMap<>();
            map.put("key" + i, "value" + i);
            Person person = new Person(i, Long.valueOf(i), (float) (i * 1.0), i > 0, "name" + i, new Date(), map, happies);
            peopleList.add(person);
        }
        peopleList.add(new Person(null, 2000L, null, null, "", null, null, null));
        return peopleList;
    }

    /**
     * 过滤操作 filter
     *
     * @param datas
     */
    public List<Person> filterOperator(List<Person> datas) {
        // 原始列表放回
//        List<Person> collect = datas.stream().collect(Collectors.toList());
        // 过滤null和数字范围
//        List<Person> collect = datas.stream().filter(person -> person.getId() != null && person.getUserId() > 20).collect(Collectors.toList());
        // 过滤""和数字范围
        List<Person> collect = datas.stream().filter(person -> !"".equals(person.getName()) && person.getUserId() > 20).collect(Collectors.toList());
        return collect;
    }

    /**
     * map操作 map
     */
    public void mapOperator(List<Person> datas) {
        // 属性提取
        List<String> collect = datas.stream().map(Person::getName).collect(Collectors.toList());
        List<String> stringList = Arrays.asList("1", "2", "3");
        // 类型转换 字符串转成数字
        List<Integer> collect2 = stringList.stream().map(Integer::valueOf).collect(Collectors.toList());
        // 计算或处理 userId都加1
        datas.stream().map(person -> person.getUserId() + 1).collect(Collectors.toList());
        // 对象转换
        Map<Integer, String> collect1 = datas.stream().collect(Collectors.toMap(k -> k.getId(), v -> v.getName()));
        System.out.println(collect);

    }

    /**
     * 打印结果
     */
    public void printResult(List<Person> collect) {
        System.out.println(collect.size());
        for (Person person : collect) {
            System.out.println(person.getId() + " " + person.getName());
        }
    }
}
